package io.spring.sample.graphql.geography;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import io.spring.sample.graphql.filter.Node;
import io.spring.sample.graphql.repository.util.Tool;

import javax.persistence.*;
import java.util.UUID;

//在地址名称叙述场景：实际上这一级别 可能省略掉。福州市鼓楼区 五四路241号XX大厦23#308;
/**乡镇级别： 数据只有一部分, 福建省的。
 * 奇葩竟然有这样的Town名字： '福建省三明市市辖区三明化工责任有限公司' ？管委会？开发区; '福建省龙岩市上杭县县属其它'
 * 2个镇Town的名字范围还能重叠？ '福建省福州市高新技术产业开发区'， '福建省福州市高新技术产业开发区上街镇'，稀奇！选择？ 另外+福州保税区；
 * 35012223福建省福州市连江县敖江镇龙华区？ 连江22个乡镇+2个镇各划3个分区：导致8位号乡镇级别的代码共有26个。
* */

@Getter
@Setter
@NoArgsConstructor
@Entity
@Table( uniqueConstraints = {@UniqueConstraint(columnNames={"name", "county_id"})} )
public class Town implements Node {
    //ERROR: unsupported comparison operator: <uuid> = <int>
    //ERROR: invalid cast: uuid -> int; 旧的@GeneratedValue(strategy = GenerationType.IDENTITY) Long id;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private UUID id;
    //规范地址命名空间
    //搜索匹配的名字， 不要太长了， 简单公用叫法的。 台江区有10个街道73个社区-上海街道。不是搜索就没啥意义。
    private String  name;        //+'街道 '乡 '镇';
    //社区居委会　相当于　村　级。
    //private int promote;    //缺省=0，  1表示区域管理级Grade提升了1级　;提升了就可以合并抹掉。
    //最低等级的行政区划。美国可能出现镇底下有市或县管市, 镇级别的市。

    //如果不需要根据Address反向级联查询People，可以注释掉
    //Adminunit才有存储了关系的id的。
    //双向的1 ：1关系 mappedBy，关系才是对方类来维护方 表字段上保存；@OneToOne缺省EAGER；
    @OneToOne(mappedBy = "town")
    private Adminunit  adm;         //最小的区划单位，只能有一个区划管理单元了。
    //private Adminunit  ads;
    //@ManyToOne


    //上级行政关系的关联：
    @ManyToOne(fetch= FetchType.LAZY)
    @JoinColumn(name = "county_id")
    private County  county;
    private Long  oldId;    //对接旧的系统ID
    //没有 ： 下级行政关系的关联：

    public String id() {
        return Tool.toGlobalId(this.getClass().getSimpleName(), String.valueOf(this.id));
    }
}

//“Town”“Township”,多数的Borough也是这个乡镇级别。
//美国比中国少了一个级别。=地区级别少了。